from django.db import models
from django.contrib.auth.models import User
from users.models import Address
from products.models import Product
import datetime
import uuid


def generate_order_id():
    """
    生成订单号函数
    格式：年月日+8位随机数字，确保订单号的唯一性
    """
    today = datetime.datetime.now().strftime('%Y%m%d')  # 获取当前日期，格式为年月日
    random_id = str(uuid.uuid4().int)[:8]  # 生成8位随机数字
    return f"{today}{random_id}"  # 拼接成订单号


class Order(models.Model):
    """
    订单模型 - 存储用户订单信息
    包含订单状态、支付方式、收货地址等信息
    """
    # 订单状态选项
    ORDER_STATUS_CHOICES = (
        ('PENDING', '待付款'),
        ('PAID', '已付款'),
        ('SHIPPING', '配送中'),
        ('DELIVERED', '已送达'),
        ('COMPLETED', '已完成'),
        ('CANCELLED', '已取消'),
        ('REFUNDING', '退款中'),
        ('REFUNDED', '已退款'),
    )
    
    # 支付方式选项
    PAYMENT_METHOD_CHOICES = (
        ('alipay', '支付宝'),
        ('wechat', '微信支付'),
        ('bank', '银行卡支付'),
        ('cod', '货到付款'),
    )
    
    # 订单基本信息
    order_id = models.CharField('订单号', max_length=20, unique=True, default=generate_order_id)  # 订单号，唯一
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders', verbose_name='用户')  # 关联用户
    
    # 收货地址信息(直接存储而不是关联Address模型，防止用户修改地址影响历史订单)
    receiver = models.CharField('收货人', max_length=50, default='')  # 收货人姓名
    province = models.CharField('省份', max_length=50, default='')  # 省份
    city = models.CharField('城市', max_length=50, default='')  # 城市
    district = models.CharField('区/县', max_length=50, default='')  # 区/县
    address = models.CharField('详细地址', max_length=200, default='')  # 详细地址
    zip_code = models.CharField('邮政编码', max_length=10, blank=True, default='')  # 邮政编码
    phone = models.CharField('联系电话', max_length=15, default='')  # 联系电话
    
    # 订单金额信息
    total_amount = models.DecimalField('订单总金额', max_digits=10, decimal_places=2)  # 订单总金额
    pay_method = models.CharField('支付方式', max_length=20, choices=PAYMENT_METHOD_CHOICES)  # 支付方式
    order_status = models.CharField('订单状态', max_length=20, choices=ORDER_STATUS_CHOICES, default='PENDING')  # 订单状态
    trade_no = models.CharField('交易号', max_length=100, blank=True, null=True)  # 第三方支付交易号
    
    # 订单时间信息
    pay_time = models.DateTimeField('支付时间', blank=True, null=True)  # 支付时间
    deliver_time = models.DateTimeField('发货时间', blank=True, null=True)  # 发货时间
    receive_time = models.DateTimeField('收货时间', blank=True, null=True)  # 收货时间
    
    # 其他订单信息
    remark = models.TextField('订单备注', blank=True, default='')  # 订单备注
    discount = models.DecimalField('优惠金额', max_digits=10, decimal_places=2, default=0.00)  # 优惠金额
    shipping_fee = models.DecimalField('运费', max_digits=10, decimal_places=2, default=0.00)  # 运费
    created_time = models.DateTimeField('创建时间', auto_now_add=True)  # 创建时间
    updated_time = models.DateTimeField('更新时间', auto_now=True)  # 更新时间
    
    class Meta:
        verbose_name = '订单'
        verbose_name_plural = '订单'
        ordering = ['-created_time']  # 按创建时间降序排序，最新的订单排在前面
    
    def __str__(self):
        return f"订单 {self.order_id}"  # 返回订单号作为字符串表示
    
    @property
    def actual_amount(self):
        """
        计算实际支付金额
        实际支付金额 = 总金额 + 运费 - 优惠
        """
        return self.total_amount + self.shipping_fee - self.discount
        
    @property
    def order_items_count(self):
        """
        获取订单商品数量
        通过关联的订单商品项计算总数量
        """
        return self.items.count()
    
    @property
    def order_status_display_color(self):
        """
        获取订单状态对应的显示颜色
        用于前端显示不同状态的订单使用不同的颜色标识
        """
        # 不同状态对应不同的Bootstrap颜色类
        status_colors = {
            'PENDING': 'warning',     # 待付款 - 黄色警告
            'PAID': 'info',           # 已付款 - 蓝色信息
            'SHIPPING': 'primary',    # 配送中 - 主色调
            'DELIVERED': 'success',   # 已送达 - 绿色成功
            'COMPLETED': 'success',   # 已完成 - 绿色成功
            'CANCELLED': 'secondary', # 已取消 - 灰色次要
            'REFUNDING': 'danger',    # 退款中 - 红色危险
            'REFUNDED': 'danger',     # 已退款 - 红色危险
        }
        return status_colors.get(self.order_status, 'secondary')  # 默认返回次要颜色


class OrderItem(models.Model):
    """
    订单商品模型 - 存储订单中的商品信息
    一个订单包含多个订单商品项
    """
    # 评价状态选项
    COMMENT_STATUS_CHOICES = (
        ('NOT_COMMENTED', '未评价'),
        ('COMMENTED', '已评价'),
    )
    
    # 关联订单和商品
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items', verbose_name='订单')  # 关联订单
    product = models.ForeignKey(Product, on_delete=models.PROTECT, verbose_name='商品')  # 关联商品，使用PROTECT防止删除已有订单的商品
    price = models.DecimalField('购买价格', max_digits=10, decimal_places=2)  # 购买时的商品价格(记录历史价格)
    quantity = models.PositiveIntegerField('购买数量', default=1)  # 购买数量
    comment_status = models.CharField('评价状态', max_length=20, choices=COMMENT_STATUS_CHOICES, default='NOT_COMMENTED')  # 评价状态
    
    class Meta:
        verbose_name = '订单商品'
        verbose_name_plural = '订单商品'
    
    def __str__(self):
        return f"{self.product.name} x {self.quantity}"  # 返回"商品名 x 数量"格式的字符串表示
    
    @property
    def total_price(self):
        """
        计算商品总价
        单价乘以数量
        """
        return self.price * self.quantity 